package com.qf.service.impl;

import com.qf.mapper.ClassRoomMapper;
import com.qf.mapper.StuMapper;
import com.qf.mapper.SubjectMapper;
import com.qf.model.ClassRoom;
import com.qf.model.Student;
import com.qf.model.Subject;
import com.qf.service.StuService;
import com.qf.vo.StudentVO;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;

/**
 * 天--道--酬--勤
 *
 * @author LiangGaoQiang
 * @ClassName StuServiceImpl
 * @Date: 2025/4/8 19:28
 * @Description: 描述
 */
@Service
public class StuServiceImpl implements StuService {
    @Autowired
    private StuMapper stuMapper;

    @Autowired
    private ClassRoomMapper classRoomMapper;

    @Autowired
    private SubjectMapper subjectMapper;

    /**
     * 根据id查询学生信息
     *
     * @param id 学生id
     * @return 学生对象
     */
    @Override
    public Student getStuById(int id) {
        return stuMapper.getStuById(id);
    }

    /**
     * 查询所有学生信息
     *
     * @return 学生列表
     */
    @Override
    public List<Student> findAllStu() {
        return stuMapper.findAllStu();
    }

    /**
     * 根据姓名或年龄查询学生信息
     *
     * @param map 包含姓名和年龄的map
     * @return 学生列表
     */
    @Override
    public List<Student> findStuByNameOrAge(HashMap<String, Object> map) {
        return stuMapper.findStuByNameOrAge(map);
    }

    /**
     * 添加学生信息
     *
     * @param student 学生对象
     * @return true表示添加成功，false表示添加失败
     */
    @Override
    public boolean addStu(Student student) {
        return stuMapper.addStu(student);
    }

    /**
     * 修改学生信息
     *
     * @param student 学生对象
     * @return true表示修改成功，false表示修改失败
     */
    @Override
    public boolean updateStuById(Student student) {
        return stuMapper.updateStuById(student);
    }

    @Override
    public boolean updateStuPartInfo(Student student) {
        return stuMapper.updateStuPartInfo(student);
    }

    /**
     * 删除学生信息
     *
     * @param id 学生id
     * @return true表示删除成功，false表示删除失败
     */
    @Override
    public boolean deleteStuById(int id) {
        return stuMapper.deleteStuById(id);
    }

    @Override
    public boolean deleteStuByListId(List<Integer> ids) {
        return stuMapper.deleteStuByListId(ids);
    }

    @Override
    public List<Student> findAllStuAndClassInfo() {
        return stuMapper.findAllStuAndClassInfo();
    }


    /**
     * 查询单个学生的个人信息以及对应的所学科目信息
     *
     * @param id 学生id
     * @return 学生信息并关联所学科目信息
     */
    @Override
    public List<Student> findStuInfoAndAllSubjectByStuId(int id) {
        return stuMapper.findStuInfoAndAllSubjectByStuId(id);
    }


    /**
     * 查询单个学生的个人信息以及对应的所学科目信息以及对应的教师信息
     *
     * @param id 学生id
     * @return 学生信息并关联所学科目信息以及对应的教师信息
     */
    @Override
    public StudentVO findStuInfoAndAllSubjectInfoAndAllTeacherInfoByStuId(int id) {
        return stuMapper.findStuInfoAndAllSubjectInfoAndAllTeacherInfoByStuId(id);
    }


    /**
     * 查询单个学生的个人信息以及对应的所学科目信息以及对应的教师信息以及对应的班级信息
     *
     * @param id 学生id
     * @return 学生信息并关联所学科目信息以及对应的教师信息以及对应的班级信息
     */
    @Override
    public StudentVO findStuInfoAndClassInfoByStuId(int id) {
        // 创建最终的结果集合,存储学生信息及教室信息
        List<StudentVO> studentVOList = new ArrayList<>();

        // 查询所有学生
        Student student = stuMapper.getStuById(id);  // 调用已经写好了的查询方法
        // 根据学生的id查询班级信息
        ClassRoom classRoom = classRoomMapper.findClassRoomByCid(student.getCid());

        // 封装学生信息以及班级信息
        StudentVO studentVO = new StudentVO();
        BeanUtils.copyProperties(student, studentVO);
        studentVO.setClassRoom(classRoom);

        return studentVO;
    }


    /**
     * 查询单个学生的个人信息以及对应的所学所有科目信息
     *
     * @param id 学生id
     * @return 学生信息并关联所学所有科目信息
     */
    @Override
    public StudentVO findSingleStuInfoAndSubjectInfoByStuId(int id) {
        // 首先通过学生id查询学生信息
        Student student = stuMapper.getStuById(id);
        // 然后通过学生id查询学生所学的所有科目的id
        List<Integer> subjectIdList = subjectMapper.selectSubjectByStuId(id);

        // 创建集合准备存储每个学科对象
        List<Subject> subjectList = new ArrayList<>();

        // 遍历所有id
        subjectIdList.forEach(sub_id -> {
            // 再根据学科id获得每一个学科对象
            Subject subject = subjectMapper.findSubjectByStuId(sub_id);
            // 存储学科对象
            subjectList.add(subject);
        });

        // 封装学生信息以及所学科目信息
        StudentVO studentVO = new StudentVO();
        BeanUtils.copyProperties(student, studentVO);
        studentVO.setSubjectList(subjectList);
        return studentVO;

    }

}
